package cn.hinglo.permission.controller;

import cn.hinglo.baseservice.base.BaseController;
import cn.hinglo.common.entity.Result;
import cn.hinglo.permission.bean.model.Menu;
import cn.hinglo.permission.bean.model.Permission;
import cn.hinglo.permission.bean.model.Role;
import cn.hinglo.permission.bean.model.Services;
import cn.hinglo.permission.service.PermissionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Set;


/**
 * @createTime: 2018/3/1
 * @author: HingLo
 * @description: 权限管理，主要是对权限，角色，进行管理
 */
@Slf4j
@RestController
@RequestMapping("/sys")
public class PermissionAction extends BaseController {

    private final PermissionService permissionService;

    @Autowired
    public PermissionAction(PermissionService permissionService) {
        this.permissionService = permissionService;
    }

    // *************************用户管理*************************

    /***
     * 查询全部用户的角色
     *
     * @param page 页码
     * @param size 大小
     * @return 返回结果
     */
    @GetMapping("listUserRole")
    public Result listUserRole(Integer page, Integer size) {
        return success(permissionService.listUserRoleService(getPage(page), getSize(size)));
    }

    /***
     * 给用户授权指定的角色
     *
     * @param userId 用户id
     * @param roleId 角色ID集合
     * @return 返回授权结果
     */
    @PostMapping("addUserRole")
    public Result addUserRole(String userId, @RequestParam("roleId[]") Set<Long> roleId) {
        return result(permissionService.addUserRoleService(userId, roleId));
    }

    /**
     * 删除用户
     *
     * @param id 用户的唯一Id
     */
    @DeleteMapping("deleteUser")
    public Result deleteUser(String id) {
        return result(permissionService.deleteUserService(id));

    }

    // *************************角色管理*************************

    /**
     * 角色列表
     */
    @GetMapping("listRole")
    public Result listRole() {
        return success(permissionService.listRoleListService());
    }

    /***
     * 添加角色
     *
     * @param role 角色对象
     */
    @PostMapping("addRole")
    public Result addRole(Role role) {
        return result(permissionService.addRoleService(role), "添加失败");
    }

    /**
     * 删除角色
     *
     * @param id 角色的唯一Id
     */
    @DeleteMapping("deleteRole")
    public Result deleteRole(String id) {
        return result(permissionService.deleteRoleService(id));

    }

    // *************************角色授权管理*************************

    /**
     * 查看角色的权限
     *
     * @param id 角色的唯一Id
     */
    @GetMapping("rolePermission")
    public Result rolePermission(String id) {
        // 指定角色的Id
        return success(permissionService.listRolePermissionService(id));
    }

    /**
     * 给指定的角色添加授权
     *
     * @param roleId 角色的唯一Id
     */
    @PostMapping("addRolePermission")
    public Result addRolePermission(Long roleId, @RequestParam("menuId[]") Set<Long> menuId,
                                    @RequestParam("permissionId[]") Set<Long> permissionId) {
        return success(permissionService.addRolePermissionService(menuId, permissionId, roleId));
    }

    // *************************权限管理*************************

    /**
     * 浏览全部权限列表
     *
     * @param page 页码
     * @param size 大小
     * @return 返回二级果
     */
    @GetMapping("listPermission")
    public Result listPermission(Integer page, Integer size) {
        return success(permissionService.listPermissionService(getPage(page), getSize(size)));
    }

    /***
     * 获取系统中所有的权限,用于授权管理使用
     *
     * @return 权限集合
     */
    @GetMapping("allPermission")
    public Result allPermission() {
        return success(permissionService.allPermissionService());
    }

    /***
     * 添加权限
     *
     * @param permission 权限对象
     * @return 添加结果
     */
    @PostMapping("addPermission")
    public Result addPermission(Permission permission) {
        boolean bool = permissionService.addPermissionService(permission);
        return result(bool, "添加失败");
    }

    /**
     * 删除指定的权限
     *
     * @param id 权限的唯一ID
     * @return 删除结果
     */
    @DeleteMapping("deletePermission")
    public Result deletePermission(String id) {
        return result(permissionService.deletePermissionService(id));

    }

    /**
     * 修改指定的权限
     *
     * @param permission 权限的对象
     * @return 修改
     */
    @PutMapping("updatePermission")
    public Result updatePermission(Permission permission) {
        return result(permissionService.changePermissionService(permission));
    }

    // *************************菜单管理*************************

    /***
     * 分页的菜单列表
     *
     * @param page 页码
     * @param size 页码大小
     * @return 返回分页列表信息
     */
    @GetMapping("listMenu")
    public Result listMenu(Integer page, Integer size) {
        return success(permissionService.listMenuService(getPage(page), getSize(size)));
    }

    /**
     * 获取所有的一级菜单,用于添加二级菜单
     *
     * @return 返回所有的一级菜单
     */
    @GetMapping("fidMenu")
    public Result fidMenu() {
        return success(permissionService.fidMenuService());
    }

    /**
     * 获取所有的菜单,递归好的菜单,(用于添加权限的时候选择隶属菜单)
     *
     * @return 返回结果
     */
    @GetMapping("allMenu")
    public Result allMenu() {
        return success(permissionService.allMenuService());
    }

    /***
     * 添加菜单
     *
     * @param menu 菜单对象
     * @return 添加结果
     */
    @PostMapping("addMenu")
    public Result addMenu(Menu menu) {
        return result(permissionService.addMenuService(menu));
    }

    /**
     * 删除菜单
     *
     * @param id 菜单的唯一Id
     * @return 删除结果
     */
    @DeleteMapping("deleteMenu")
    public Result deleteMenu(String id) {
        return result(permissionService.deleteMenuService(id), "删除失败");

    }

    /**
     * 更新菜单信息
     *
     * @param menu 菜单对象
     * @return 返回更新结果
     */
    @PutMapping("updateMenu")
    public Result updateMenu(Menu menu) {
        return result(permissionService.updateMenuService(menu));
    }

    // ******************************服务管理**************************

    /**
     * 全部服务列表
     *
     * @return 返回结果
     */
    @GetMapping("listService")
    public Result listService() {
        return success(permissionService.listService());
    }

    /**
     * 添加服务
     *
     * @param service 服务对象
     * @return 返回添加结果
     */
    @PostMapping("addService")
    public Result addService(Services service) {
        return success(permissionService.addService(service));
    }

    /**
     * 修改服务层列表
     *
     * @param service 修改系统中的服务
     * @return 返回结果
     */
    @PutMapping("updateService")
    public Result updateService(Services service) {
        return success(permissionService.updateService(service));
    }

    /**
     * 删除服务
     *
     * @param id id
     * @return 删除结果
     */
    @DeleteMapping("deleteService")
    public Result deleteService(Integer id) {
        return success(permissionService.deleteService(id));
    }
}
